/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servicos;

import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.io.*;
import java.nio.charset.Charset;
import java.security.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.*;

/**
 *
 * @author Edemilson
 */
public class RSA {

    Cipher cifra = null;

    public RSA() {
        try {
            cifra = Cipher.getInstance("RSA");
        } catch (Exception ex) {
            Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public KeyPair gerarParChaves() throws NoSuchAlgorithmException {

        // Gera um par de chaves RSA de 1024 bits  
        KeyPairGenerator gerador = KeyPairGenerator.getInstance("RSA");
        gerador.initialize(1024);
        KeyPair chaves = gerador.generateKeyPair();


        return chaves;
    }

    public String crifrarRSA(String mensagem, PublicKey chavePublica) throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, UnsupportedEncodingException {
               
        Charset UTF8 = Charset.forName("UTF-8");
        //Criptografia a mensagem com a chave publica  
        // Inicializa o algoritmo para a criptografia 

        cifra.init(Cipher.ENCRYPT_MODE, chavePublica);

        // criptgrafia o texto inteiro  
        byte[] mensagemCifrada = cifra.doFinal(mensagem.getBytes(UTF8));
        
        String msgCifrada = Base64.encode(mensagemCifrada);
        return msgCifrada;

    }

    public String decifrarRSA(String mensagemCifrada, PrivateKey chavePrivada) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, Base64DecodingException {
        // Cria uma implementacao do RSA  
        cifra = Cipher.getInstance("RSA");

        cifra.init(Cipher.DECRYPT_MODE, chavePrivada);
        byte[] mensagemOriginal = cifra.doFinal(Base64.decode(mensagemCifrada));
        
        String msgOriginal = new String(mensagemOriginal);
        
       

        return msgOriginal;
    }

    public static void main(String[] args) throws Exception {

        RSA rsa = new RSA();

        String mensagem = "Edemilson Danker";        
        
        KeyPair par = rsa.gerarParChaves();
        
        String msgCripto = rsa.crifrarRSA(mensagem, par.getPublic());        
        
        System.out.println(msgCripto);
                        
        String msgOriginal = rsa.decifrarRSA(msgCripto, par.getPrivate());    
        
        System.out.println(msgOriginal);      
        
    }
}